<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>转发（forward）和重定向（redirect）的区别，以及各种技术的代码实现方式</title>
<!-- 设置不缓存 -->
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />

</head>

<body>

<center>

<h1>转发（forward）和重定向（redirect）的区别，以及各种技术的代码实现方式</h1>
<p style="text-align: left;">
参考地址：<br/>
1、jsp中forward和redirect的区别：<a href="http://blog.163.com/tsing_hua/blog/static/139622224201101110836644/">http://blog.163.com/tsing_hua/blog/static/139622224201101110836644/</a><br/>
</p>
     
     <table border="2" cellpadding="5">
	     <tr>
	     	<td colspan="4" style="text-align: center;font-weight: bolder;">区别要点</td>
	     </tr>
	     <tr style="text-align: center;font-weight: bolder;">
	     	<td>序号</td>
	     	<td>转发（forward）</td>
	     	<td>重定向（redirect）</td>
	     	<td>备注</td>
	     </tr>
	     <tr>
	     	<td>1、行为方式</td>
	     	<td>服务器行为</td>
	     	<td>客户端行为</td>
	     	<td></td>
	     </tr>
	     <tr>
	     	<td>2、浏览器地址</td>
	     	<td>地址不变</td>
	     	<td>地址变化</td>
	     	<td></td>
	     </tr>
	     <tr>
	     	<td>3、参数信息</td>
	     	<td>参数不变</td>
	     	<td>参数丢失</td>
	     	<td></td>
	     </tr>
	     <tr>
	     	<td>4、具体过程</td>
	     	<td>
	     	转发过程：客户浏览器发起HTTP请求——>Web服务器接受此请求——>调用内部的一个方法在Web容器内部完成请求处理和转发动作——>将目标资源发送给客户。<br/>
	     	注意：这里转发的路径必须是同一个Web容器下的其他URL，其不能转向到其他的Web路径上去，中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径，也就是说客户是感觉不到Web服务器做了转发的。转发行为是浏览器只做了一次访问请求。</td>
	     	<td>
	     	重定向过程：客户浏览器发起HTTP请求——>Web服务器接受后发送302状态码响应及对应新的URL给客户浏览器——>客户浏览器发现是302状态码响应，则自动会使用这个新的URL再发起一个新的HTTP请求——>新请求对应的Web服务器将目标资源发送给客户。<br/>
	     	注意：既然是浏览器重新发出了请求，则就没有什么request传递的概念了。在客户浏览器地址栏中显示的是其重定向的新URL路径，客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求。</td>
	     	<td></td>
	     </tr>
	 </table>
	 <br>
     <table border="2" cellpadding="5">
	     <tr>
	     	<td style="text-align: center;font-weight: bolder;">技术方式</td>
	     	<td style="text-align: center;font-weight: bolder;">转发（forward）</td>
	     	<td style="text-align: center;font-weight: bolder;">重定向（redirect）</td>
	     	<td style="text-align: center;font-weight: bolder;">推荐度</td>
	     	<td style="text-align: center;font-weight: bolder;">备注</td>
	     </tr>
	     <tr>
	     	<td style="text-align: center;font-weight: bolder;">JSP</td>
	     	<td>
	     		示例：客户端请求A.jsp，而目标是转发到B.jsp上。则在A.jsp中，实现代码：<br/>
	     		（1）&lt;% request.getRequestDispatcher("B.jsp").forward(request, response); %/&gt;
	     		<br/>
	     		（2）&lt;jsp:forward page=&quot;B.jsp&quot; /&gt;
	     	</td>
	     	<td>
	     		示例：客户端请求A.jsp，而目标是重定向到B.jsp上。则在A.jsp中，实现代码：<br/>
	     		（1）&lt;% response.sendRedirect("B.jsp"); %/&gt;
	     		<br/>
	     		（2）相当于客户端直接链接到：&lt;a target="_self" href=&quot;B.jsp&quot; /&gt;
	     		<br/>
	     		（3）相当于客户端执行JS脚本：window.self.location.href="B.jsp";
	     	</td>
	     	<td style="color:red;">*****</td>
	     	<td></td>
	     </tr>
	     <tr>
	     	<td style="text-align: center;font-weight: bolder;">Servlet</td>
	     	<td>
	     		（1）request.getRequestDispatcher("B.jsp").forward(request, response);
	     	</td>
	     	<td>
	     		（1）response.sendRedirect("B.jsp");
	     	</td>
	     	<td style="color:red;">*****</td>
	     	<td></td>
	     </tr>
	     <tr>
	     	<td style="text-align: center;font-weight: bolder;">Struts2.X</td>
	     	<td>
	     		（1）Action中直接，无需struts.xml配置：<br>
	     		ServletActionContext.getRequest().getRequestDispatcher("B.jsp").forward(ServletActionContext.getRequest(),ServletActionContext.getResponse());
	     		<br/>
	     		return null;
	     		<br/>
	     		（2）Action中间接，需要struts.xml配置：<br>
	     		struts.xml中：&lt;result name="toB" type="dispatcher"&gt;B.jsp&lt;/result&gt;（由于Struts2中type属性的默认值是dispatcher，因此也可以省略type属性）
	     		<br/>
	     		return "toB";
	     	</td>
	     	<td>
	     		（1）Action中直接，无需struts.xml配置：<br>
	     		ServletActionContext.getResponse().sendRedirect("B.jsp");
	     		<br/>
	     		return null;
	     		<br/>
	     		（2）Action中间接，需要struts.xml配置：<br>
	     		struts.xml中：&lt;result name="toB" type="redirect"&gt;B.jsp&lt;/result&gt;（非Action时）
	     		<br/>
	     		return "toB";
	     		<br/>
	     		（3）Action中间接，需要struts.xml配置：<br>
	     		struts.xml中：&lt;result name="toB" type="redirectAction"&gt;B.jsp的对应ActionName&lt;/result&gt;（是Action时）
	     		<br/>
	     		return "toB";
	     	</td>
	     	<td style="color:red;">*****</td>
	     	<td>在Action中，也可以采用Servlet的实现方案</td>
	     </tr>
	     <tr>
	     	<td style="text-align: center;font-weight: bolder;">Struts1.X</td>
	     	<td>
	     		（1）Action中直接，无需struts-config.xml配置：<br>
	     		request.getRequestDispatcher("B.jsp").forward(request, response);
	     		<br/>
	     		return null; 
	     		<br/>
	     		（2）Action中直接，无需struts-config.xml配置：<br>
	     		return new ActionForward("B.jsp"); 
	     		<br/>
	     		（3）Action中间接，需要struts-config.xml配置：<br>
	     		struts-config.xml中：&lt;forward name="toB" path="B.jsp" /&gt;
	     		<br/>
	     		return mapping.findForward("toB")
	     	</td>
	     	<td>
	     		（1）Action中直接，无需struts-config.xml配置：<br>
	     		return response.sendRedirect("B.jsp");
	     		<br/>
	     		return null; 
	     		<br/>
	     		（2）Action中直接，无需struts-config.xml配置：<br>
	     		return new ActionForward("B.jsp"); 
	     		<br/>
	     		（3）Action中间接，需要struts-config.xml配置：<br>
	     		struts-config.xml中：&lt;forward name="toB" path="B.jsp" redirect="true" /&gt;
	     		<br/>
	     		return mapping.findForward("toB")
	     	</td>
	     	<td style="color:red;">***</td>
	     	<td>在Action中，也可以采用Servlet的实现方案</td>
	     </tr>
	</table>
</div>
     
     </center>
	</body>
</html>
